package com.code.test.dance;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * https://leetcode.cn/problems/merge-two-2d-arrays-by-summing-values/description/
 * <p>
 * 2570. 合并两个二维数组 - 求和法
 * <p>
 * 给你两个 二维 整数数组 nums1 和 nums2.
 * <p>
 * nums1[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。
 * nums2[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。
 * 每个数组都包含 互不相同 的 id ，并按 id 以 递增 顺序排列。
 * <p>
 * 请你将两个数组合并为一个按 id 以递增顺序排列的数组，并符合下述条件：
 * <p>
 * 只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。
 * 每个 id 在结果数组中 只能出现一次 ，并且其对应的值等于两个数组中该 id 所对应的值求和。如果某个数组中不存在该 id ，则认为其对应的值等于 0 。
 * 返回结果数组。返回的数组需要按 id 以递增顺序排列。
 */
public class ArrayMergerWithSum {

    public static void main(String[] args) {
        int[][] nums1 = {{1, 2}, {2, 3}, {4, 5}};
        int[][] nums2 = {{1, 4}, {3, 2}, {4, 1}};

        int[][] ret = mergeArrays(nums1, nums2);
        System.out.println(Arrays.deepToString(ret));

    }

    public static int[][] mergeArrays(int[][] nums1, int[][] nums2) {
        List<int[]> mergedList = new ArrayList<>();
        int m = nums1.length, n = nums2.length;
        int index1 = 0, index2 = 0;
        //按照id合并
        while (index1 < m && index2 < n) {
            int id1 = nums1[index1][0], val1 = nums1[index1][1];
            int id2 = nums2[index2][0], val2 = nums2[index2][1];
            if (id1 < id2) {
                mergedList.add(new int[]{id1, val1});
                index1++;
            } else if (id1 > id2) {
                mergedList.add(new int[]{id2, val2});
                index2++;
            } else {
                mergedList.add(new int[]{id1, val1 + val2});
                index1++;
                index2++;
            }
        }
        //如果 数组1还有剩余
        while (index1 < m) {
            int id = nums1[index1][0], val = nums1[index1][1];
            mergedList.add(new int[]{id, val});
            index1++;
        }
        //如果数组2还有剩余
        while (index2 < n) {
            int id = nums2[index2][0], val = nums2[index2][1];
            mergedList.add(new int[]{id, val});
            index2++;
        }
        return mergedList.toArray(new int[mergedList.size()][]);
    }
}

/**
 https://blog.csdn.net/weixin_38845058/article/details/100582339

 */